Возможности и ограничения
В двух словах, можно составлять 1 мкс программы по своему усмотрению. Энкодеры в любых вариациях, ШД всё подвластно и не ограничено пресловутой 1 миллисекундой основного цикла. Да, длительность цикла программы будет 1 микросекунда, т.е. в 1000 раз быстрее “основного цикла”.
В процессоре AM1808 два PRU ядра, которые работают на высокой частоте и имеют прямой доступ к некоторым входам-выходам.
Сопроцессоры (PRU) работают на частоте 200 МГц, почти все команды выполняют за 1 такт, и, что хорошо, они не отвлекаются на лишние задачи.
Разумеется, в 1 такт всю программу не уложишь, но за 200 тактов можно многое сделать, т.е. “длительность цикла” порядка 1 мкс достигается без проблем.
Предел размера программы – 1024 команды. Если учесть, что “быстрых” входов выходов не более 4 штук, то и этих 1024 команд вполне хватит для широкого спектра задач. Из команд доступна простая арифметика в 32 bit int (без умножения/деления), условные переходы.
Например, если нужно “отключить мотор по достижению нужного количества импульсов энкодера”, то можно в “1 мкс быстрой программе обсчитывать энкодер и управлять выходом”.
Hardella vs CoDeSys
Этот раздел можно смело пропускать. А можно и не пропускать.
CoDeSys не поддерживает создание PRU программ, поэтому “PRU программа” составляется в среде Hardella. В конце концов, конечно, всем всё равно должен управлять “основной цикл ПЛК”, который управляется из CoDeSys.
Работает это следующим образом:
- PRU программа пишется на ST языке
- Hardella компилирует PRU ST в машинный код
- Скомпилированный код преобразуется в массив байт на ST языке и уже это передаётся в CoDeSys виде
.exp
файла - “Основной цикл” заливает PRU программу при работе ПЛК, и всё начинает работать
Характеристики ПЛК110 М02
Работа PRU программ проверялась на ОВЕН ПЛК110 М02.
- Частота PRU: 200 МГц (команды выполняются за 5 нс)
- Количество PRU: 2 шт. PRU0 и PRU1
- Быстрые входы 1, 2, 3 и 4 заведены на PRU0
- Быстрые выходы 1 и 2 управляются от PRU1
- Быстрые выходы 3 и 4 управляются от PRU0
- Максимальная длина PRU программы: 1024 команды (ассемблерных)
- Объём регистровой памяти: около 30
DWORD
регистров (около 120 байт)
Варианты использования
По умолчанию, быстрые входы-выходы настраиваются в CoDeSys в разделе PLC Configuration
, но есть возможность перевести PRU в свободно программируемый режим, что нам и нужно.
Из-за ограничений прошивки ПЛК110, доступны следующие варианты:
PRU0 | PRU1 | Комментарий |
---|---|---|
PLC Configuration | PLC Configuration | Обычный режим |
Свободная программа | PLC Configuration | Свободная программа в PRU0 |
Свободная программа | Свободная программа | Две программы одновременно |
Язык программирования
Программы пишутся на языке ST, с некоторыми ограничениями:
- Не поддерживаются сложные выражения. Т.е. чтобы записать
d := a+b-c
нужно делать промежуточную переменную и записывать какu := b-c; d:= a+b;
. При этом не стоит думать, что “использование одной временной переменной” сократит используемые ресурсы. Если использовать разные переменные, то компилятор сможет понять, когда одна из них становится ненужной. - В условных операторах (
IF
,WHILE
,REPEAT
) составныеAND
,OR
работают, но тоже не в любых комбинациях. Если скомпилировалось, то норм. Если “не поддерживается”, то будет ошибка компиляции. - Не поддерживаются функции
- Не поддерживаются структуры
- Не поддерживаются массивы
- Пока только
unsigned
типы:BOOL
,BYTE
,WORD
,DWORD
иENUM
- Все переменные размещаются в регистрах PRU. Поэтому при большом количестве переменных может не хватить регистровой памяти. Тем не менее, промежуточные вычисления могут переиспользовать один и тот же регистр, т.е. ограничение не на общее количество, а на количество “одновременно нужных” переменных
Особенности:
- Доступа к “текущему времени” нет, но есть счётчик выполненных тактов процессора. 1 такт == 5 нс.
- В программах можно использовать ассемблерные вставки.
Принцип выполнения программ
Каждое PRU ядро работает по классическому алгоритму “цикла постоянной длительности”.
WHILE TRUE DO
Выполнение_пользовательского_кода(); (* <-- это и есть прикладной код *)
REPEAT
Обмен_данными_с_основной_программой();
Опрос_входов();
UNTIL время_следующего_цикла не настало
END_REPEAT;
Запись_выходов();
Опрос_входов(); (* на всякий пожарный *)
END_WHILE;
Длительность цикла выбирается при составлении программы и указывается в PRU Configuration
.
Как и в обычном ПЛК-программировании, цикл WHILE TRUE
в прикладном коде не нужен, его добавит среда. Нужно лишь написать программу (PROGRAM
), и обозначить на каком PRU ядре она должна выполняться.
Принцип PRU программирования совпадает с принципом обычного ПЛК программирования. Отличие в том, что у PRU “длительность цикла” может составлять микросекунды.
Комментировать